package cn.edu.ctgu.xxj;

import java.time.Duration;
import java.time.ZonedDateTime;
import java.time.format.DateTimeParseException;
import java.util.Set;

public class TelephoneBilling {
    //计费需要的参数
    private static final double RATE_UNDER_20_MINUTES = 0.05; // 每分钟0.05美元
    private static final double RATE_OVER_20_MINUTES = 0.10; // 超过20分钟的部分每分钟0.10美元
    private static final double BASE_COST_OVER_20_MINUTES = 1.00; // 超过20分钟的基础费用1.00美元
    private static final int THRESHOLD_MINUTES = 20; // 20分钟的阈值
    private static final int MAX_CALL_DURATION = 30 * 60; // 最大通话时间：30 小时（1800 分钟）

    // 允许的时区列表(这里随意设置几个用于后续测试，可根据实际需求进行修改)
    private static final Set<String> SUPPORTED_TIMEZONES = Set.of(
            "America/New_York", "Asia/Shanghai"
    );
    // 计算通话费用
    public  double calculateBilling(String startTime, String endTime) {
        try {
            ZonedDateTime start = ZonedDateTime.parse(startTime);
            ZonedDateTime end = ZonedDateTime.parse(endTime);
            // 检查时区是否受支持
            if (!SUPPORTED_TIMEZONES.contains(start.getZone().toString()) ||
                    !SUPPORTED_TIMEZONES.contains(end.getZone().toString())) {
                throw new IllegalArgumentException("错误：存在不支持的时区");
            }

            // **检查是否是跨时区通话**
            boolean isCrossTimeZone = !start.getZone().equals(end.getZone());
            // 计算通话时长，考虑夏令时以及冬令时的转换
            if (isCrossTimeZone) {
                // **如果是跨时区通话，检查转换后的 UTC 时间是否正确**
                if (start.toInstant().isAfter(end.toInstant())) {
                    throw new IllegalArgumentException("错误：时区转换导致结束时间早于开始时间");
                }
            }

            // **计算通话费用**
            Duration duration = Duration.between(start, end);
            return getCost(duration);
        } catch (DateTimeParseException e) {
            throw new IllegalArgumentException("错误：输入的字符串时间格式非法");
        }
    }

    private static double getCost(Duration duration) {
        long totalMinutes = duration.toMinutes();  //总分钟数，忽略了剩余的秒数
        long seconds = duration.getSeconds() % 60; //剩余的秒数

        // 如果有剩余的秒数，向上取整到分钟
        if (seconds > 0) {
            totalMinutes += 1;
        }

        // 通话时长错误检查
        if (totalMinutes < 0) {
            throw new IllegalArgumentException("错误：通话时长不能为负");
        }
        if (totalMinutes > MAX_CALL_DURATION) {
            throw new IllegalArgumentException("错误：超出最大通话时长30h");
        }

        System.out.println("通话时长：" + totalMinutes + "分钟");
        // 计算通话费用
        double cost = 0.0;
        //通话时间小于等于20分钟，则按照每分钟0.05美元计费
        if (totalMinutes <= THRESHOLD_MINUTES) {
            cost = totalMinutes * RATE_UNDER_20_MINUTES;
        } else {
            double overMinutes = (double)(totalMinutes - THRESHOLD_MINUTES);   // 超过20分钟的分钟数
            cost = overMinutes * RATE_OVER_20_MINUTES + BASE_COST_OVER_20_MINUTES;
        }
        // **四舍五入保留两位小数**
        return Math.round(cost * 100.0) / 100.0;
    }


}
